package cn.com.anypay.manager.lakala.dto;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.experimental.Accessors;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import jakarta.validation.constraints.Size;
import java.io.Serializable;

/**
 * 拉卡拉电子合同申请请求DTO
 *
 * @author Claude
 * @date 2024-01-15
 */
@Data
@Accessors(chain = true)
public class LakalaContractApplyRequest implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 订单号（四方机构自定义）
     */
    @NotBlank(message = "订单号不能为空")
    @Size(max = 32, message = "订单号长度不能超过32位")
    @JsonProperty("order_no")
    private String orderNo;

    /**
     * 机构号
     */
    @NotNull(message = "机构号不能为空")
    @JsonProperty("org_id")
    private Integer orgId;

    /**
     * 合同类别
     * EC008: 特约商户支付服务合作协议V4.1（商户入网）
     * EC007: 特约商户支付服务合作协议V4.1+分账
     * EC009: 清分结算授权委托书
     */
    @NotBlank(message = "合同类别不能为空")
    @Pattern(regexp = "EC00[789]", message = "合同类别必须是EC007、EC008或EC009")
    @JsonProperty("ec_type_code")
    private String ecTypeCode;

    /**
     * 法人/经营者证件类型
     * RESIDENT_ID: 身份证
     * PASSPORT: 护照
     * HK_MACAO_PASS: 港澳居民往来内地通行证
     * TAIWAN_PASS: 台湾居民来往大陆通行证
     */
    @NotBlank(message = "证件类型不能为空")
    @JsonProperty("cert_type")
    private String certType;

    /**
     * 法人/经营者姓名
     */
    @NotBlank(message = "法人/经营者姓名不能为空")
    @Size(max = 32, message = "姓名长度不能超过32位")
    @JsonProperty("cert_name")
    private String certName;

    /**
     * 法人/经营者证件号码
     */
    @NotBlank(message = "证件号码不能为空")
    @Size(max = 32, message = "证件号码长度不能超过32位")
    @JsonProperty("cert_no")
    private String certNo;

    /**
     * 签约手机号
     * 注意：不可修改，请慎重填写
     */
    @NotBlank(message = "签约手机号不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    @JsonProperty("mobile")
    private String mobile;

    /**
     * 营业执照号（个体工商户或企业商户必传）
     */
    @JsonProperty("business_license_no")
    private String businessLicenseNo;

    /**
     * 营业执照名称（个体工商户或企业商户必传）
     */
    @JsonProperty("business_license_name")
    private String businessLicenseName;

    /**
     * 企业/经营者结算开户行号
     */
    @NotBlank(message = "开户行号不能为空")
    @Size(max = 32, message = "开户行号长度不能超过32位")
    @JsonProperty("openning_bank_code")
    private String openningBankCode;

    /**
     * 企业/经营者结算开户行名称
     */
    @NotBlank(message = "开户行名称不能为空")
    @Size(max = 128, message = "开户行名称长度不能超过128位")
    @JsonProperty("openning_bank_name")
    private String openningBankName;

    /**
     * 企业/经营者结算卡性质
     * 57: 对公
     * 58: 对私
     */
    @NotBlank(message = "账户性质不能为空")
    @Pattern(regexp = "5[78]", message = "账户性质必须是57（对公）或58（对私）")
    @JsonProperty("acct_type_code")
    private String acctTypeCode;

    /**
     * 企业/经营者结算卡号
     */
    @NotBlank(message = "结算账号不能为空")
    @Size(max = 32, message = "结算账号长度不能超过32位")
    @JsonProperty("acct_no")
    private String acctNo;

    /**
     * 企业/经营者结算卡名称
     */
    @NotBlank(message = "账户名称不能为空")
    @Size(max = 64, message = "账户名称长度不能超过64位")
    @JsonProperty("acct_name")
    private String acctName;

    /**
     * 电子合同内容参数集合（JSON字符串）
     * 根据ec_type_code传递不同的参数集合
     */
    @NotBlank(message = "合同参数不能为空")
    @JsonProperty("ec_content_parameters")
    private String ecContentParameters;

    /**
     * 是否经办签约
     * 0: 不启用
     * 1: 启用
     */
    @JsonProperty("agent_tag")
    private Integer agentTag = 0;

    /**
     * 经办人名称（agentTag为1时必传）
     */
    @JsonProperty("agent_name")
    private String agentName;

    /**
     * 经办人证件类型（agentTag为1时必传）
     */
    @JsonProperty("agent_cert_type")
    private String agentCertType;

    /**
     * 经办人证件号（agentTag为1时必传）
     */
    @JsonProperty("agent_cert_no")
    private String agentCertNo;

    /**
     * 经办签约授权委托书文件名（agentTag为1时必传）
     */
    @JsonProperty("agent_file_name")
    private String agentFileName;

    /**
     * 经办授权委托书文件路径（agentTag为1时必传）
     */
    @JsonProperty("agent_file_path")
    private String agentFilePath;

    /**
     * 备注说明
     */
    @Size(max = 128, message = "备注长度不能超过128位")
    @JsonProperty("remark")
    private String remark;

    /**
     * 电子合同签约结果回调通知URL
     */
    @JsonProperty("ret_url")
    private String retUrl;

    /**
     * 版本号（固定值）
     */
    @JsonProperty("version")
    private String version = "1.0";
}